package com.cl.unipay4j.core;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 请求结果
 *
 * @author siashan
 * @since v1.0.1
 **/
@Setter
@Getter
@NoArgsConstructor
public class Result<T> {

    /**
     * 通信状态
     */
    private String returnCode;

    /**
     * 交易状态
     */
    private String tradeState;

    /**
     * 错误码
     */
    private String errCode;
    /**
     * 错误信息
     */
    private String errMsg;


    /**
     * 额外数据
     */
    private T data;


    public Result(String returnCode, String tradeState, String errCode, String errMsg, T data) {
        this.returnCode = returnCode;
        this.tradeState = tradeState;
        this.errCode = errCode;
        this.errMsg = errMsg;
        this.data = data;
    }

    /**
     * 方法描述:  接口调用成功
     *
     * @param data  需要返回的数据
     * @return Result
     */
    public static <T> Result<T> returnSuccess(T data) {
        return new Result(UnipayConst.SUCCESS, null, null, null, data);
    }

    /**
     * 方法描述:  业务交易成功
     *
     * @param data  需要返回的数据
     * @return Result
     */
    public static <T> Result<T> tradeSuccess(T data) {
        return new Result(UnipayConst.SUCCESS, UnipayConst.SUCCESS, null, null, data);
    }


    /**
     * 方法描述:  业务交易失败
     *
     * @param tradeStatus   交易状态
     * @param msg   msg消息
     * @return Result
     */
    public static Result tradeFail(String tradeStatus, String msg) {
        return new Result(UnipayConst.SUCCESS, tradeStatus, null, msg, null);
    }

    /**
     * 方法描述:  业务交易失败
     *
     * @param tradeStatus  交易状态
     * @param errCode  错误代码
     * @param errMsg  错误消息
     * @return Result
     */
    public static Result tradeFail(String tradeStatus, String errCode, String errMsg) {
        return new Result(UnipayConst.SUCCESS, tradeStatus, errCode, errMsg, null);
    }

    /**
     * 方法描述: 接口调用失败
     *
     * @param errCode  错误代码
     * @param errMsg  错误消息
     * @return Result
     */
    public static <T> Result returnFail(String errCode, String errMsg) {
        return new Result(UnipayConst.FAIL, null, errCode, errMsg, null);
    }


    /**
     * 方法描述: 接口调用失败
     *
     * @return Result
     */
    public static <T> Result exception() {
        return new Result(UnipayConst.FAIL, null, UnipayConst.EXCEPTION, "服务未知异常", null);
    }

    /**
     * 方法描述: 接口验签失败
     *
     * @return Result
     */
    public static <T> Result invalidSign() {
        return new Result(UnipayConst.FAIL, null, UnipayConst.INVALID_SIGN, "接口验签失败", null);
    }


    /**
     * 是否通信成功
     *
     * @return 是否通信成功
     */
    public boolean isReturnSuccess() {
        return UnipayConst.SUCCESS.equals(this.returnCode);
    }


    /**
     * 是否交易成功
     *
     * @return 是否交易成功
     */
    public boolean isTradeSuccess() {
        return UnipayConst.SUCCESS.equals(this.tradeState);
    }


    /**
     * 是否验签成功
     *
     * @return 是否验签成功
     */
    public boolean isInvalidSign() {
        return UnipayConst.INVALID_SIGN.equals(this.errCode);
    }

}
